﻿using GDM.Hogar.Aplicacion.Properties;
using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using System;
using System.Linq;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Actividades
{
    public partial class FrmConsultaActividades
#if DEBUG
 : FrmConsultaActividad
#else
             : FrmConsulta<ConsultaActividad>
#endif
    {
        private readonly IActividadManager _actividadManager;
        private readonly IAgenteManager _agenteManager;
        private FrmActividad _frmCrearActividad;
        private FrmActividad _frmEditarActividad;

        private bool EsResponsable
        {
            get { return ContextoUsuario.RolId == (int)Rol.Responsable; }
        }

        #region Public Methods

        public FrmConsultaActividades(IActividadManager actividadManager, IAgenteManager agenteManager)
        {
            if (actividadManager == null)
                throw new ArgumentNullException("actividadManager");
            if (agenteManager == null)
                throw new ArgumentNullException("agenteManager");

            _actividadManager = actividadManager;
            _agenteManager = agenteManager;
            InitializeComponent();
        }

        #endregion Public Methods

        #region Private Methods

        protected override void CrearRegistro()
        {
            _frmCrearActividad = AbrirOActivarFormulario(_frmCrearActividad, frmPadre: MdiParent, action: frm => frm.OnActividadCreada = RefrescarGrilla);
        }

        protected override void EditarRegistro(ConsultaActividad actividad)
        {
            _frmEditarActividad = AbrirOActivarFormulario(_frmEditarActividad, frmPadre: MdiParent, action: frm =>
            {
                frm.OnActividadActualizada = RefrescarGrilla;
                frm.Actividad = actividad;
            });
        }

        protected override void EliminarRegistro(ConsultaActividad actividad)
        {
            if (actividad.TipoActividadId == (int)TipoActividad.Comedor ||
                actividad.TipoActividadId == (int)TipoActividad.Vianda)
            {
                MostrarMensajeError(Resources.EliminarActividad_NoEsPosible);
                return;
            }
            try
            {
                //- desactivar actividad en bd
                _actividadManager.ActivarActividad(actividad.ActividadId, false);
                Datos.First(a => a.ActividadId.Equals(actividad.ActividadId)).Activa = false;
                btnBuscar_Click(null, null);
                MostrarMensajeExito(Resources.Actividad_EliminadaConExito);
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.EliminarActividad_Error);
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            dgActividades.Search(Datos.AsQueryable(), CriterioDeBusqueda);
        }

        private void btnQuitarFiltro_Click(object sender, EventArgs e)
        {
            LimpiarControl(gbFiltros);
            btnBuscar_Click(null, null);
        }

        private void CargarActividades()
        {
            Datos = _actividadManager.ObtenerActividades();
            InicializarGrilla(dgActividades, a => a.Activa);
            ckbActivos.Visible = Datos.Any();
        }

        private void ckbActivos_CheckedChanged(object sender, EventArgs e)
        {
            dgActividades.UserCanDelete = ckbActivos.Checked && EsResponsable;
            dgActividades.ReadOnlyMode = !ckbActivos.Checked || !EsResponsable;
            btnBuscar_Click(null, null);
        }

        private bool CriterioDeBusqueda(ConsultaActividad actividad)
        {
            var criterio = actividad.Activa == ckbActivos.Checked;
            if (cmbResponsable.SelectedIndex > 0)
            {
                criterio = criterio && actividad.ResponsableId == ((ConsultaAgente)cmbResponsable.SelectedItem).AgenteId;
            }
            if (!txtNombre.Text.EsVacio()) criterio = criterio && actividad.Nombre.ToLower().Contains(txtNombre.Text.ToLower());

            return criterio;
        }

        private void CargarResponsables()
        {
            cmbResponsable.CargarItems(_agenteManager.ObtenerAgentes(), "NombreCompleto", "AgenteId", true);
        }

        private void FrmConsultaActividades_Load(object sender, EventArgs e)
        {
            dgActividades.UserCanDelete = EsResponsable;
            dgActividades.UserCanAdd = EsResponsable;
            dgActividades.ReadOnlyMode = !EsResponsable;
            CargarResponsables();
            CargarActividades();
            ttInfo.SetToolTip(btnQuitarFiltro, "Quitar filtro");
            txtNombre.Focus();
        }

        private void RefrescarGrilla()
        {
            Datos = _actividadManager.ObtenerActividades();
            btnBuscar_Click(null, null);
        }

        #endregion Private Methods
    }
}